package br.edu.unifei.cct810.trabalho01.modelo.automato;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;

public class Automato {
	
	private HashMap<Integer, Estado> estados, estadosFinais = null;
	
	private HashSet<Transicao> transicoes = null;
	
	private Estado estadoInicial = null;
	
	public Automato(){
		this.estados = new HashMap<Integer, Estado>();
		this.estadosFinais = new HashMap<Integer, Estado>();
		this.transicoes = new HashSet<Transicao>();
	}
	
	public void defineEstado(int identificador){
		estados.put(new Integer(identificador), new Estado(identificador));
	}
	
	public void defineEstadoFinal(int identificador){
		estadosFinais.put(new Integer(identificador), new Estado(identificador));
	}
	
	public void defineEstadoInicial(int identificador){
		estadoInicial = new Estado(identificador);
	}
	
	public void removeEstado(int identificador){
		estados.remove(new Integer(identificador));
	}
	
	public void defineTransicao(int origem, int destino, String simbolo){
		transicoes.add(new Transicao(estados.get(new Integer(origem)), estados.get(new Integer(destino)), simbolo));
	}
	
	public Transicao retornaTransicao(int origem, String simbolo){
		for(Transicao trans : transicoes){
			if((trans.retornaEstadoOrigem().retornaID() == origem) &&
			   (trans.retornaSimbolo().equals(simbolo))){
				return trans;
			}
		}
		
		return null;
	}
	
	public boolean eEstadoFinal(int origem){
		return estadosFinais.get(new Integer(origem)) != null ? true : false;
	}
	
	public void removeTransicao(int origem, int destino, String simbolo){
		Estado inicio = estados.get(new Integer(origem));
		Estado fim = estadosFinais.get(new Integer(destino));
		
		for(Iterator iter = transicoes.iterator(); iter.hasNext();){
			Transicao trans = (Transicao) iter.next();
			if(trans.retornaEstadoOrigem().equals(inicio) && 
			trans.retornaEstadoDestino().equals(fim) &&
			trans.retornaSimbolo().equals(simbolo)){
				transicoes.remove(trans);
				break;
			}
		}
	}
}
